

# 序列化
from demo import serializers
from demo import models
from rest_framework.views import APIView
from rest_framework import status
from rest_framework.response import Response

"""
APIView，是DRF中的View，继承了django的View，并增加了几个功能:

1 传入到视图方法中的是REST framework 的 Request对象，而不是Django的Http Requeset对象；

2 视图方法可以返回REST framework的Response对象，视图会为响应数据设置（render）符合前端要求的格式；

3 任何APIException异常都会被捕获到，并且处理成合适的响应信息；

4 在进行dispatch()分发前，会对请求进行身份认证、权限检查、流量控制
"""
class BookListAPIView(APIView):
    def get(self, request):
        # 1 查询出所有图书模型，得到一个查询集
        book = models.Book.objects.all()

        # 将模型序列化
        s = serializers.DrfBookSerializer(book, many=True)
        print(s)

        # 这时得到是一个有序字典
        res = Response(s.data)
        print(res.data)

        # 这时会进行render处理，前端得到的就是一个JSON格式的数据
        return res

    def post(self, request):
        # 将前端post传来的JSON_Bytes的数据 转换成 python字典
        res = request.data
        print(res)

        s = serializers.DrfBookSerializer(data=res)
        # 对数据鉴权合规性处理
        s.is_valid(raise_exception=True)
        s.save()

        return Response(s.data, status=status.HTTP_201_CREATED)

class BookDetailAPIView(APIView):
    def get(self, request, pk):

        book = models.Book.objects.get(id=pk)

        s = serializers.DrfBookSerializer(book)
        res = Response(s.data)
        print(res.data)

        return Response(res.data)

    def put(self, request, pk):

        res = request.data

        book = models.Book.objects.get(id=pk)

        s = serializers.DrfBookSerializer(instance=book, data=res)
        s.is_valid(raise_exception=True)
        s.save()

        return Response(s.data, status=status.HTTP_200_OK)

    def delete(self, request, pk):
        book = models.Book.objects.get(id=pk)

        book.delete()

        return Response(status=status.HTTP_200_OK)